#ifndef __EVENT_EXPORT_HPP__
#define __EVENT_EXPORT_HPP__


#include "initial_event.hpp"
#include "user_code_run_event.hpp"
#include "spj_code_compile_event.hpp"
#include "std_code_compile_event.hpp"
#include "user_code_compile_event.hpp"
#include "std_code_run_event.hpp"
#include "twins_spj_user_run_event.hpp"
#include "twins_spj_std_run_event.hpp"
#include "text_compare_event.hpp"
#include "spj_verify_event.hpp"
#include "calculate_result_event.hpp"
#include "unknown_event.hpp"
#include "end_event.hpp"

#ifdef ENABLE_DB_JUDGE

#include "database_std_sql_run_event.hpp"
#include "database_user_sql_run_event.hpp"
#include "database_update_event.hpp"
#include "database_compare_event.hpp"

#endif


namespace run_code_event_space {

/* 
all event derived need define 'execute_impl' template function 
class U, allow different judge_type execute more flexible customization

However, it is best to keep the function implementation simple enough that 
the behavior variables of the mutating function should be passed as parameters, 
and the default behavior should use default parameters
In this case, judge_type passes custom parameters by passing custom functions 'custom_params',
and implement two hook functions 'pre_execute(event)' and 'post_execute(event)'
*/


using run_code_event_t = std::variant<
    initial_event,
    user_code_compile_event,
    spj_code_compile_event,
    std_code_compile_event,
    user_code_run_event,
    std_code_run_event,
    twins_spj_user_run_event,
    twins_spj_std_run_event,
#ifdef ENABLE_DB_JUDGE
    database_std_sql_run_event,
    database_user_sql_run_event,
    database_update_event,
    database_compare_event,
#endif
    text_compare_event,
    spj_verify_event,
    calculate_result_event,
    unknown_event,
    end_event
>;

}
#endif /* __EVENT_EXPORT_HPP__ */
